package leetcode.sword;/*
地上有一个m行n列的方格，从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动，它每次可以向左、右、上、下移动一格（不能移动到方格外），
也不能进入行坐标和列坐标的数位之和大于k的格子。
例如，当k为18时，机器人能够进入方格 [35, 37] ，因为3+5+3+7=18。但它不能进入方格 [35, 38]，因为3+5+3+8=19。请问该机器人能够到达多少个格子？
示例 1：
输入：m = 2, n = 3, k = 1
输出：3

示例 2：
输入：m = 3, n = 1, k = 0
输出：1

提示：
1 <= n,m <= 100
0 <= k <= 20
 */

/*
思路：深度优先遍历，递归
 */

public class P13 {
    public static void main(String[] args) {
        //初始化一个标志二维数组（m*n），元素=0表示未搜索，=1表示已搜索
        int m = 2, n = 3, k = 1;
        int[][] records = new int[m][n];
        System.out.println(reachableNum(records, 0, 0, k));
    }

    public static int reachableNum(int[][] records, int row, int col, int k){
        /*
        records:标志二维数组
        row, col:开始搜索的行列号
        k:允许搜索格子的最大下标位和
         */
        if(row<0 || row>records.length-1 || col<0 || col>records[0].length-1){
            return 0;
        }
        if(records[row][col]!=0){ //搜索过
            return 0;
        }
        //当前格子没有搜索过，先比较当前位和与k
        records[row][col] = 1; //当前格子标记为已搜索
        if(getDigtalSum(row)+getDigtalSum(col)>k){
            return 0;
        }else {//只有当前格子可达才向四周探索
            return 1 + reachableNum(records, row-1, col, k) +
                    reachableNum(records, row+1, col, k) +
                    reachableNum(records, row, col-1, k) +
                    reachableNum(records, row, col+1, k);
        }
    }

    public static int getDigtalSum(int num){
        //1 <= num <= 100
        int hund = num/100;
        return num%10 + (num-100*hund)/10 + hund;
    }
}
